package cn.tedu.mall.search.service.impl;

import cn.tedu.mall.common.restful.JsonPage;
import cn.tedu.mall.pojo.product.model.Spu;
import cn.tedu.mall.pojo.search.entity.SpuEntity;
import cn.tedu.mall.pojo.search.entity.SpuForElastic;
import cn.tedu.mall.product.service.front.IForFrontSpuService;
import cn.tedu.mall.search.repository.SpuForElasticRepository;
import cn.tedu.mall.search.service.ISearchService;
import lombok.extern.slf4j.Slf4j;
import org.apache.dubbo.config.annotation.DubboReference;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageRequest;
import org.springframework.stereotype.Service;

import java.util.ArrayList;
import java.util.List;

@Service
@Slf4j
public class ServiceLocalServiceImpl implements ISearchService {
    @DubboReference
    private IForFrontSpuService dubboSpuService;
    @Autowired
    private SpuForElasticRepository  spuRepository;
    // 利用dubbo从product模块中分页查询所有spu数据,并新增到es到操作

    @Override
    public void loadSpuByPage() {
        // 查询一次才能知道分页信息,指定循环条件,典型的es的操作
        //  使用do-while 循环
        int i = 1;
        int pagees = 0; //总页数初始值为0
        do {
            // dubbo查询当前spu信息
            JsonPage<Spu> spus= dubboSpuService.getSpuByPage(i,2);
            //  实例化一个SpuForEalstic泛型的集合,以备spus集合中的数据转换后赋值添加
            List<SpuForElastic> esSpus = new ArrayList<>();
            // 遍历,从数据库中查出的spus
            for (Spu spu: spus.getList()){
                // 实例化es的实体类
                SpuForElastic esSpu = new SpuForElastic();
                // 将spu对象的同名对象赋值给esSpu
                BeanUtils.copyProperties(spu,esSpu);
                // 将赋值好的esSpu对象,新增到esSpus集合中
                esSpus.add(esSpu);
            }
            //  利用springData框架提供的批量新增方法执行新增操作
            spuRepository.saveAll(esSpus);
            i++;
            pagees = spus.getTotalPage();
            log.info("成功新增第{}页数据",i);
        }while (i<=pagees);// 循环条件是当前页码不超过总页数
    }



    @Override
    public JsonPage<SpuForElastic> search(String keyword, Integer page, Integer pageSize) {
        // springData分页,参数0表示第一,需要将page-1才能查询正确页码
        Page<SpuForElastic> spus = spuRepository.querySearch(keyword, PageRequest.of(page-1,pageSize));
        //  业务逻辑层要求返回JsonPage类型,实例化JsonPage对象并赋值
        JsonPage<SpuForElastic> jsonPage = new JsonPage<>();
        //  当前页码
        jsonPage.setPage(page);
        jsonPage.setPageSize(pageSize);
        //  赋值总页数,总条数
        jsonPage.setTotalPage(spus.getTotalPages());
        jsonPage.setTotal(spus.getTotalElements());
        // 赋值分页数据
        jsonPage.setList(spus.getContent());

        return jsonPage;
    }
}
